/* 商品 */
#ifndef __PROP_H__
#define __PROP_H__

#include "Global.h"

class Prop; // 前置声明
using PropPtr = std::shared_ptr<Prop>; // 声明一个智能指针

// 商品
class Prop
{
public:
    // 商品构造
    Prop(CStrRef Name, int Price, bool PropFlag) : Name(Name), Price(Price), PropFlag(PropFlag) {}
    DEFINE_MEMBER(Name, std::string); // 名字
    DEFINE_MEMBER(Price, int);        // 价格
    DEFINE_MEMBER(PropFlag, bool);
    // 展示商品的参数信息
    virtual void show() = 0;
    // 商品拷贝（当要拿一个对象的拷贝的时候，把它做成多态，可以拷贝一个指针对象）
    // 纯虚函数clone，专门拷贝当前的对象，返回一个智能指针，子类要自己实现这个clone函数
    virtual PropPtr clone() = 0;
    // 获取商品信息的接口
    virtual std::vector<std::string> GetPropInfo() = 0;
    // 虚析构函数 
    virtual ~Prop() = default; 

};

// 武器
class Weapon : public Prop
{
public:
    // 武器构造
    Weapon(CStrRef Name, int Price, int attack, bool PropFlag) : Prop(Name, Price, PropFlag), Attack(attack) {}
    DEFINE_MEMBER(Attack, int); // 可以增加的攻击力
    // 展示武器参数信息
    void show() override; // override检查是不是虚函数，不是虚函数就会报错
    // 武器拷贝
    PropPtr clone() override; 
    // 实现获取商品信息的方法
    std::vector<std::string> GetPropInfo() override;   
};

using WeaponPtr = std::shared_ptr<Weapon>;

// 防具
class Armor : public Prop
{
public:
    // 防具构造
    Armor(CStrRef Name, int Price, int defend, bool PropFlag) : Prop(Name, Price, PropFlag), Defend(defend) {}
    DEFINE_MEMBER(Defend, int); // 可以增加的防御力
    // 展示防具参数信息
    void show() override; // override检查是不是虚函数，不是虚函数就会报错
    // 防具拷贝
    PropPtr clone() override;
    // 实现获取商品信息的方法
    std::vector<std::string> GetPropInfo() override;
};

// 药水
class Medicine : public Prop
{
public:
    // 药水构造
    Medicine(CStrRef Name, int Price, int hp, bool PropFlag) : Prop(Name, Price, PropFlag), HP(hp) {}
    DEFINE_MEMBER(HP, int); // 可以增加的血量
    // 展示药水参数信息
    void show() override; // override检查是不是虚函数，不是虚函数就会报错
    // 药水拷贝
    PropPtr clone() override;
    // 实现获取商品信息的方法
    std::vector<std::string> GetPropInfo() override;
};

#endif